package com.hongpu.controller;

import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.hongpu.domain.SysUser;
import com.hongpu.dto.ResetPasswordDto;
import com.hongpu.dto.SysUserDetailDto;
import com.hongpu.dto.TenantAdminDto;
import com.hongpu.service.SysUserService;
import com.hongpu.utils.ResultDto;
import com.hongpu.vo.SysUserDetailVo;
import com.hongpu.vo.TenantAdminVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @author 张玉胜
 * @since 2025年05月14日
 */

@RestController
@RequestMapping("/user")
public class SysUserController {
    @Autowired
    SysUserService sysUserService;
    /**
     * 超级管理员账号，此账号不可删除
     */
    private static final String SUPER_ADMIN_CANNOT_BE_DELETED = "superAdmin";

    /**
     * 超级管理员新增租户管理员，新增的用户所属租户ID需要前端传递
     */
    @PostMapping("/addTenantAdmin")
    public ResultDto addTenantAdmin(@RequestBody SysUser sysUser) {
        return sysUserService.ignoreTenantIdAndAddTenantAdmin(sysUser);
    }
    /**
     * 超级管理员删除租户管理员
     */
    @GetMapping("/deleteTenantAdmin/{userId}")
    public ResultDto deleteTenantAdmin(@PathVariable("userId") Long userId) {
        String account = sysUserService.ignoreTenantIdAndGetSysUserByUserId(userId);
        if(account != null && SUPER_ADMIN_CANNOT_BE_DELETED.equals(account)){
            return ResultDto.warning("超级管理员账号不可删除");
        }
        boolean delete = sysUserService.ignoreTenantIdAndDeleteSysUserByUserId(userId);
        if (!delete) {
            return ResultDto.fail();
        }
        return ResultDto.ok();
    }
    /**
     * 超级管理员启用租户管理员
     */
    @GetMapping("/activeTenantAdmin/{userId}")
    public ResultDto activeTenantAdmin(@PathVariable("userId") Long userId) {
        boolean active = sysUserService.ignoreTenantIdAndActiveSysUserByUserId(userId);
        if (!active) {
            return ResultDto.fail();
        }
        return ResultDto.ok();
    }

    /**
     * 超级管理员获取租户管理员详情
     */
    @GetMapping("/detailTenantAdmin/{userId}")
    public ResultDto detailTenantAdmin(@PathVariable("userId") Long userId) {
        TenantAdminVo tenantAdminVo = sysUserService.ignoreTenantIdAndDetailSysUserByUserId(userId);
        if (tenantAdminVo == null) {
            return ResultDto.fail();
        }
        return ResultDto.ok(tenantAdminVo);
    }
    /**
     * 超级管理员在租户下新增租户管理员时，根据选择的租户ID查询该租户下是否有管理员用户
     */
    @GetMapping("/getTenantAdminByTenantId/{tenantId}")
    public ResultDto getTenantAdminByTenantId(@PathVariable("tenantId") Long tenantId) {
       return sysUserService.getTenantAdminByTenantId(tenantId);
    }




    /**
     * 租户管理员分页列表
     */
    @PostMapping("/pageTenantAdmin")
    public ResultDto pageTenantAdmin(@RequestBody TenantAdminDto tenantAdminDto) {
        IPage<TenantAdminVo> page = sysUserService.ignoreTenantIdAndPageTenantAdmin(tenantAdminDto);
        return ResultDto.ok(page);
    }
    /**
     * 修改租户管理员信息
     */
    @PostMapping("/updateTenantAdmin")
    public ResultDto updateTenantAdmin(@RequestBody TenantAdminDto tenantAdminDto) {
        boolean updateTenantAdmin = sysUserService.ignoreTenantIdAndUpdateTenantAdmin(tenantAdminDto);
        if (!updateTenantAdmin) {
            return ResultDto.fail();
        }
        return ResultDto.ok();
    }
    /**
     * 修改租户管理员密码
     */
    @PostMapping("/updateTenantAdminPassword")
    public ResultDto updateTenantAdminPassword(@RequestBody TenantAdminDto tenantAdminDto) {
        boolean updateTenantAdmin = sysUserService.ignoreTenantIdAndUpdateTenantAdminPassword(tenantAdminDto);
        if (!updateTenantAdmin) {
            return ResultDto.fail();
        }
        return ResultDto.ok();
    }

    /**
     * 租户的管理员新增用户
     * @param sysUser
     * @return
     */
    @PostMapping("/add")
    public ResultDto add(@RequestBody SysUser sysUser) {
       return sysUserService.add(sysUser);
    }

    /**
     * 租户的管理员删除普通用户
     */
    @GetMapping(value = "/deleteById/{id}")
    public ResultDto deleteById(@PathVariable("id") Long id){
        return sysUserService.deleteUserById(id);
    }
    /**
     * 租户的管理员启用普通用户
     */
    @GetMapping(value = "/activeById/{id}")
    public ResultDto activeById(@PathVariable("id") Long id){
        return sysUserService.activeById(id);
    }
    /**
     * 租户管理员根据用户ID查询用户详情
     */
    @GetMapping(value = "/detail/{id}")
    public ResultDto detail(@PathVariable("id") Long id){
       return sysUserService.detail( id);
    }
    /**
     * 租户管理员根据用户ID修改用户详情
     */
    @PostMapping(value = "/update")
    public ResultDto update(@RequestBody SysUserDetailDto sysUserDetailDto){
       return sysUserService.update(sysUserDetailDto);
    }
    /**
     * 租户管理员重置用户密码
     */
    @PostMapping(value = "/resetPassword")
    public ResultDto resetPassword(@RequestBody ResetPasswordDto resetPasswordDto){
        return sysUserService.resetPassword(resetPasswordDto);
    }
    /**
     * 用户修改自己的密码
     */
    @PostMapping(value = "/updatePasswordByUserId")
    public ResultDto updatePasswordByUserId(@RequestBody ResetPasswordDto resetPasswordDto){
        return sysUserService.resetPassword(resetPasswordDto);
    }

    /**
     * 租户管理员查询当前租户下所有用户的分页列表
     */
    @PostMapping(value = "/page")
    public ResultDto page(@RequestBody SysUserDetailDto sysUserDetailDto){
        return sysUserService.page(sysUserDetailDto);
    }
    /**
     * 登录成功后，进入首页，前端获取用户信息
     */
    @GetMapping(value = "/info")
    public ResultDto info(){
        return sysUserService.getUserInfo();
    }
}